package com.tenthoundsqps.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tenthoundsqps.entity.Order;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单数据访问接口
 * 继承MyBatis Plus的BaseMapper，提供基础的CRUD操作
 * 同时定义一些自定义的查询方法
 */
public interface OrderDao extends BaseMapper<Order> {
    
    /**
     * 根据用户ID查询订单列表（查询热数据）
     * 
     * @param userId 用户ID，分片键
     * @param limit 限制返回的订单数量
     * @return 订单列表
     */
    @Select("SELECT * FROM t_order WHERE user_id = #{userId} AND is_archived = 0 ORDER BY create_time DESC LIMIT #{limit}")
    List<Order> selectByUserId(@Param("userId") Long userId, @Param("limit") int limit);
    
    /**
     * 根据订单号查询订单（查询热数据）
     * 
     * @param orderNo 订单编号
     * @return 订单信息
     */
    @Select("SELECT * FROM t_order WHERE order_no = #{orderNo} AND is_archived = 0")
    Order selectByOrderNo(@Param("orderNo") String orderNo);
    
    /**
     * 查询需要归档的订单（创建时间早于指定时间且未归档的订单）
     * 
     * @param archiveTime 归档时间阈值
     * @param limit 限制查询数量
     * @return 需要归档的订单列表
     */
    @Select("SELECT * FROM t_order WHERE create_time < #{archiveTime} AND is_archived = 0 LIMIT #{limit}")
    List<Order> selectOrdersToArchive(@Param("archiveTime") LocalDateTime archiveTime, @Param("limit") int limit);
    
    /**
     * 归档订单（将订单标记为已归档）
     * 
     * @param orderId 订单ID
     * @return 更新记录数
     */
    @Update("UPDATE t_order SET is_archived = 1 WHERE id = #{orderId} AND is_archived = 0")
    int archiveOrder(@Param("orderId") Long orderId);
    
    /**
     * 从归档表查询订单（查询冷数据）
     * 
     * @param userId 用户ID
     * @param limit 限制返回的订单数量
     * @return 归档的订单列表
     */
    @Select("SELECT * FROM t_order_archived WHERE user_id = #{userId} ORDER BY create_time DESC LIMIT #{limit}")
    List<Order> selectArchivedByUserId(@Param("userId") Long userId, @Param("limit") int limit);
}